package store;

import org.jdom.Element;
import store.Frammento;
import exceptions.XmlException;

public class RifIngrediente extends Frammento {
	private double quantita;
	private Cibo ingrediente;
	
	public RifIngrediente(double quantita, Cibo ingrediente) {
		super();
		this.quantita = quantita;
		this.ingrediente = ingrediente;
	}
	
	public double getQuantita() {
		return quantita;
	}
	
	public void setQuantita(double quantita) {
		this.quantita = quantita;
	}
	
	public Cibo getIngrediente() {
		return ingrediente;
	}
	
	public Element toXml() {
		Element element = new Element("rif_ingrediente");
		if (quantita > 0) element.addContent(new Element("quantita").setText(Double.toString(quantita)));
		element.setAttribute("cibo", ingrediente.getNome());
		
		return element;
	}
	
	public static RifIngrediente fromXml(Element rifIngrediente, boolean checkCibo) throws XmlException {
		if (rifIngrediente.getName() != "rif_ingrediente" || rifIngrediente.getAttribute("cibo") == null)
			throw new XmlException("L'elemento passato come parametro non rappresenta un riferimento a un ingrediente");
		double q = 0;
		Element qEl = rifIngrediente.getChild("quantita");
		if (qEl != null) q = Double.parseDouble(qEl.getText());
		Cibo c;
		if (checkCibo) {
			try {
				c = Cibo.fromXml(TuttiCibi.getTuttiCibi().getCiboElement(rifIngrediente.getAttributeValue("cibo")));
			} catch (Exception e) {
				throw new XmlException(e);
			}
		} else c = new Cibo(rifIngrediente.getAttributeValue("cibo"), null, null);
		return new RifIngrediente(q, c);
	}
	
	@Override
	public String toString() {
		String s = "";
		if (quantita % 1 == 0)
			s = (int)quantita + "";
		else s = quantita + "";
		return (quantita > 0 ? s + " " : "") + (ingrediente.getInfo().getUnitaRiferimento() == null ? "" : ingrediente.getInfo().getUnitaRiferimento().toStringShort() + " di ") + ingrediente.getNome() + " ";
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((ingrediente == null) ? 0 : ingrediente.hashCode());
		long temp;
		temp = Double.doubleToLongBits(quantita);
		result = prime * result + (int)(temp ^ (temp >>> 32));
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		RifIngrediente other = (RifIngrediente)obj;
		if (ingrediente == null) {
			if (other.ingrediente != null) return false;
		} else if (!ingrediente.equals(other.ingrediente)) return false;
		if (Double.doubleToLongBits(quantita) != Double.doubleToLongBits(other.quantita)) return false;
		return true;
	}
}
